// chat.js
const request = require('../../utils/request')

Page({
  data: {
    // 医生ID
    doctorId: null,
    // 医生信息
    doctorInfo: null,
    // 聊天消息列表
    messageList: [],
    // 输入框内容
    inputContent: '',
    // 是否正在发送消息
    sending: false,
    // 是否正在加载历史消息
    loading: false,
    // 是否还有更多历史消息
    hasMore: true,
    // 页码
    page: 1,
    // 每页消息数量
    pageSize: 20,
    // 滚动区域高度
    scrollHeight: 0,
    // 滚动到底部的标志
    scrollToBottom: true,
    // 消息轮询定时器ID
    pollingTimer: null
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // 获取医生ID
    const doctorId = options.doctorId
    if (!doctorId) {
      wx.showToast({
        title: '医生ID不存在',
        icon: 'none'
      })
      setTimeout(() => {
        wx.navigateBack()
      }, 1500)
      return
    }

    // 获取系统信息计算滚动区域高度
    const systemInfo = wx.getSystemInfoSync()
    const scrollHeight = systemInfo.windowHeight - 50 // 输入框高度

    this.setData({
      doctorId,
      scrollHeight
    })

    // 获取医生信息
    this.getDoctorInfo(doctorId)
    
    // 获取聊天记录
    this.getChatHistory()
    
    // 开始轮询新消息
    this.startPolling()
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
    // 清除轮询定时器
    if (this.data.pollingTimer) {
      clearInterval(this.data.pollingTimer)
    }
  },

  /**
   * 开始轮询新消息
   */
  startPolling() {
    // 每5秒检查一次新消息
    const timer = setInterval(() => {
      this.checkNewMessages()
    }, 5000)
    
    this.setData({
      pollingTimer: timer
    })
  },

  /**
   * 检查新消息
   */
  checkNewMessages() {
    const lastMsgTime = this.getLastMessageTime()
    
    request.get('/student/chat/checkNewMessages', {
      doctorId: this.data.doctorId,
      lastTime: lastMsgTime
    }, true).then(res => {
      if (res.code === 0 && res.data && res.data.length > 0) {
        // 有新消息，添加到列表中
        const newMessages = res.data
        this.setData({
          messageList: [...this.data.messageList, ...newMessages],
          scrollToBottom: true
        })
      }
    }).catch(err => {
      console.error('检查新消息失败', err)
    })
  },

  /**
   * 获取最后一条消息的时间
   */
  getLastMessageTime() {
    const { messageList } = this.data
    if (messageList.length === 0) {
      return 0
    }
    const lastMsg = messageList[messageList.length - 1]
    return lastMsg.sendTime || 0
  },

  /**
   * 获取医生信息
   */
  getDoctorInfo(doctorId) {
    request.get(`/student/doctor/getInfo?key=${doctorId}`, {}, true)
      .then(res => {
        if (res.code === 0 && res.data && res.data.length > 0) {
          this.setData({
            doctorInfo: res.data[0]
          })
        } else {
          wx.showToast({
            title: res.message || '获取医生信息失败',
            icon: 'none'
          })
        }
      })
      .catch(err => {
        console.error('获取医生信息失败', err)
        wx.showToast({
          title: '获取医生信息失败',
          icon: 'none'
        })
      })
  },

  /**
   * 获取聊天历史记录
   */
  getChatHistory(refresh = false) {
    if (this.data.loading || (!refresh && !this.data.hasMore)) return
    
    this.setData({ loading: true })
    
    // 如果是刷新，重置页码
    if (refresh) {
      this.setData({ page: 1, messageList: [], hasMore: true })
    }
    
    request.get('/student/chat/history', {
      doctorId: this.data.doctorId,
      page: this.data.page,
      pageSize: this.data.pageSize
    }, true).then(res => {
      this.setData({ loading: false })
      
      if (res.code === 0 && res.data) {
        // 获取历史消息成功
        const { total, items } = res.data
        
        // 判断是否还有更多数据
        const hasMore = items.length === this.data.pageSize && 
                        this.data.messageList.length + items.length < total
        
        // 更新数据，注意历史消息需要倒序添加到前面
        this.setData({
          messageList: [...items.reverse(), ...this.data.messageList],
          page: this.data.page + 1,
          hasMore,
          scrollToBottom: refresh // 仅在刷新时滚动到底部
        })
      } else {
        wx.showToast({
          title: res.message || '获取聊天记录失败',
          icon: 'none'
        })
      }
    }).catch(err => {
      console.error('获取聊天记录失败', err)
      this.setData({ loading: false })
      wx.showToast({
        title: '获取聊天记录失败',
        icon: 'none'
      })
    })
  },

  /**
   * 发送消息
   */
  sendMessage() {
    const { inputContent, doctorId, sending } = this.data
    
    if (!inputContent.trim() || sending) return
    
    this.setData({ sending: true })
    
    request.post('/student/chat/send', {
      doctorId,
      content: inputContent.trim(),
      type: 'text' // 目前只支持文本消息
    }, true).then(res => {
      this.setData({ sending: false })
      
      if (res.code === 0 && res.data) {
        // 发送成功，清空输入框并添加消息到列表
        this.setData({
          inputContent: '',
          messageList: [...this.data.messageList, res.data],
          scrollToBottom: true
        })
      } else {
        wx.showToast({
          title: res.message || '发送消息失败',
          icon: 'none'
        })
      }
    }).catch(err => {
      console.error('发送消息失败', err)
      this.setData({ sending: false })
      wx.showToast({
        title: '发送消息失败',
        icon: 'none'
      })
    })
  },

  /**
   * 输入框内容变化
   */
  inputChange(e) {
    this.setData({
      inputContent: e.detail.value
    })
  },

  /**
   * 点击发送按钮
   */
  onSendTap() {
    this.sendMessage()
  },

  /**
   * 下拉加载更多历史消息
   */
  onScrollToUpper() {
    if (this.data.hasMore && !this.data.loading) {
      this.getChatHistory()
    }
  },

  /**
   * 聊天内容滚动到底部
   */
  scrollToBottom() {
    if (this.data.scrollToBottom) {
      this.setData({
        scrollToBottom: false
      })
      
      // 使用选择器获取消息列表，并滚动到底部
      const query = wx.createSelectorQuery()
      query.select('#message-list').boundingClientRect()
      query.exec(res => {
        if (res && res[0]) {
          wx.pageScrollTo({
            scrollTop: res[0].height,
            duration: 300
          })
        }
      })
    }
  },

  /**
   * 返回上一页
   */
  goBack() {
    wx.navigateBack()
  }
}) 